import cv2
import numpy as np

img = cv2.imread("img/basic01.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# cv2.RETR_EXTERNAL 只检测外轮廓
# cv2.RETR_LIST:对检测到的轮廓不建立等级关系
# cv2.RETR_CCOMP:检索所有轮廓并将他们组织成两级层次结构。上面的一层为外边界，
# 下面一层为内孔的边界。如果内孔内还有一个连通物体，那么这个物体的边界仍然位于顶层。
# cv2.RETR_TREE: 建立一个等级树结构的轮廓
# `cv2.CHAIN_APPROX_NONE`：存储所有的轮廓点，相邻两个点的像素位置差不超过 1， 即 `max(abs(x1-x2)，abs(y2-y1))=1`。
# `cv2.CHAIN_APPROX_SIMPLE`：压缩水平方向、垂直方向、对角线方向的元素，只保 留该方向的终点坐标。例如，在极端的情况下，
# 一个矩形只需要用 4 个点来保存轮廓信息。
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 轮廓的层级关系
print(hierarchy)
# contours 轮廓上的点
# for contour in contours:
#     for item in contour:
#         x, y = item[0]
#         # cv2画圆
#         # cv2.circle(原图, 中心点坐标, 半径, color=颜色, thickness=线的宽度)
#         cv2.circle(img, (x, y), 2, color=(0, 0, 255), thickness=2)

# 绘制轮廓的方式
cv2.drawContours(img, contours, -1, color=(0, 0, 0), thickness=2)

cv2.imshow("src", img)
cv2.waitKey(0)
